/**  Model
 * 模型类
 */
var Model = Event.extend({
    init : function(dao) {
        this._super();

        this.dao = dao || {};

        this.set(this.dao);
    },

    /**
     * 可以指定键名，值的形式
     * 也可以直接指定一个json形式，一次性set多个值
     *
     * set('a', 'val')
     * set({a : 'val' , b : 'val2'})
     */
    set : function(k, v) {
        var dao = {};

        if (typeof(k) == 'object' && k !== null) {
            dao = k;
        } else {
            dao[k] = v;
        }

        /**
         * p prev  表示之前的值
         * n new   表示新值
         */
        var _this = this,
            p, n;

        /**
         * 先设置所有值，然后再逐一触发事件
         * 否则可能会出现监听的事件被触发，但是后续还未设置的值获取不到
         */
        $.each(dao, function(k, v) {
            p = _this.dao[k] || null;
            n = v;

            _this.dao[k] = v;
        })

        $.each(dao, function(k, v) {
            /**
             * 目前只支持 属性名:set事件，触发事件时传递新值和前一次的值
             * 如需其它事件触发，可使用Model.trigger()
             */
            _this.trigger(k + ':set', [n, p]);   //
        })
    },

    /**
     * 如果不指定k，则返回所有数据
     */
    get : function(k) {
        if (typeof(k) == 'undefined') {
            return this.dao;
        }

        return this.dao[k] || null;
    }

});
